<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>

    <body>
        <script>
            let p1 = new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve(111)
                    // reject(111)
                })
            }, 2000)
            let p2 = new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve(222)
                    // reject(222)
                })
            }, 1000)
            let p3 = new Promise((resolve, reject) => {
                setTimeout(() => {
                    reject(333)
                    // resolve(333)
                })
            }, 3000)

            // 1.0  方法一
            // Promise.race 的实现
            // function raceall(arr){
            //     return new Promise(resolve=>{
            //         arr.forEach(promise=>{
            //             promise.then(res=>{
            //                 // 正常输出
            //                 resolve(res)
            //                 // 异常输出
            //             },err=>{
            //                 resolve(err)
            //             })
            //         })
            //     })
            // }

            // 优化：
            function promises(arr) {
            return new Promise((reslove, reject) => {
                arr.forEach(promise => {
                    promise.then(reslove,reject)
                })
            });
            }

            // 方法二：
            // function promises(arr) {
            //     return new Promise((resolve, reject) => {
            //         // 不需要使用索引，循环出每一项
            //         for (var item of arr) {
            //             Promise.resolve(item).then(resolve, reject)
            //         }
            //     })
            // }

            // 2.0 Promise.all 实现
            // function promises(arr) {
            //     let arr1 = [],
            //     let count = 0
            //     return new Promise((resolve, reject) => {
            //         arr.forEach((item, i) => {
            //             Promise.resolve(item).then(res => {
            //                 arr1[i] = res,
            //                     count += 1
            //                 if (count === arr.length){
            //                     resolve(arr1)
            //                 }
            //             }).catch(reject)
            //         })
            //     })
            // }

            // 3.0 Promise.allSettled() 实现
            //     function promises(arr){
            //     return new Promise(reslove=>{
            //         let resArr = new Array(arr.length);
            //         let count = 0;
            //         arr.forEach((p,key)=>{
            //             p.then(res=>{
            //                 let obj = {};
            //                 obj.status = "fulfilled";
            //                 obj.value = res;
            //                 resArr[key] = obj;
            //                 count++;
            //                 if(count===arr.length){
            //                     reslove(resArr)
            //                 }
            //             },err=>{
            //                 let obj = {
            //                     status:"rejected",
            //                     reson:err
            //                 };
            //                 resArr[key] = obj;
            //                 count++;
            //                 if(count===arr.length){
            //                     reslove(resArr)
            //                 }
            //             })
            //         })
            //     })
            // }
            
            promises([p1, p2, p3]).then(res => {
                    console.log(res);
            },err=>{
                console.log(err);
            })
        </script>
    </body>

    </html>
</body>

</html>